home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / GCC 1.37.1r14 / BSD #includes / sys / sys⁄vnode.h < prev    next >
Encoding:
Text File  |  1992-09-04  |  13.9 KB  |  334 lines  |  [TEXT/UNIX]

  1. /*
  2.  * Copyright (c) 1989 The Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    @(#)vnode.h    7.39 (Berkeley) 6/27/91
  34.  */
  35.  
  36. #ifndef KERNEL
  37. #include <machine/endian.h>
  38. #endif
  39.  
  40. /*
  41.  * The vnode is the focus of all file activity in UNIX.
  42.  * There is a unique vnode allocated for each active file,
  43.  * each current directory, each mounted-on file, text file, and the root.
  44.  */
  45.  
  46. /*
  47.  * vnode types. VNON means no type.
  48.  */
  49. enum vtype     { VNON, VREG, VDIR, VBLK, VCHR, VLNK, VSOCK, VFIFO, VBAD };
  50.  
  51. /*
  52.  * Vnode tag types.
  53.  * These are for the benefit of external programs only (e.g., pstat)
  54.  * and should NEVER be inspected inside the kernel.
  55.  */
  56. enum vtagtype    { VT_NON, VT_UFS, VT_NFS, VT_MFS };
  57.  
  58. /*
  59.  * This defines the maximum size of the private data area
  60.  * permitted for any file system type. A defined constant 
  61.  * is used rather than a union structure to cut down on the
  62.  * number of header files that must be included.
  63.  */
  64. #define    VN_MAXPRIVATE    188
  65.  
  66. struct vnode {
  67.     u_long        v_flag;            /* vnode flags (see below) */
  68.     short        v_usecount;        /* reference count of users */
  69.     short        v_writecount;        /* reference count of writers */
  70.     long        v_holdcnt;        /* page & buffer references */
  71.     off_t        v_lastr;        /* last read (read-ahead) */
  72.     u_long        v_id;            /* capability identifier */
  73.     struct mount    *v_mount;        /* ptr to vfs we are in */
  74.     struct vnodeops    *v_op;            /* vnode operations */
  75.     struct vnode    *v_freef;        /* vnode freelist forward */
  76.     struct vnode    **v_freeb;        /* vnode freelist back */
  77.     struct vnode    *v_mountf;        /* vnode mountlist forward */
  78.     struct vnode    **v_mountb;        /* vnode mountlist back */
  79.     struct buf    *v_cleanblkhd;        /* clean blocklist head */
  80.     struct buf    *v_dirtyblkhd;        /* dirty blocklist head */
  81.     long        v_numoutput;        /* num of writes in progress */
  82.     enum vtype    v_type;            /* vnode type */
  83.     union {
  84.         struct mount    *vu_mountedhere;/* ptr to mounted vfs (VDIR) */
  85.         struct socket    *vu_socket;    /* unix ipc (VSOCK) */
  86.         caddr_t        vu_vmdata;    /* private data for vm (VREG) */
  87.         struct specinfo    *vu_specinfo;    /* device (VCHR, VBLK) */
  88.         struct fifoinfo    *vu_fifoinfo;    /* fifo (VFIFO) */
  89.     } v_un;
  90.     enum vtagtype    v_tag;            /* type of underlying data */
  91.     char v_data[VN_MAXPRIVATE];        /* private data for fs */
  92. };
  93. #define    v_mountedhere    v_un.vu_mountedhere
  94. #define    v_socket    v_un.vu_socket
  95. #define    v_vmdata    v_un.vu_vmdata
  96. #define    v_specinfo    v_un.vu_specinfo
  97. #define    v_fifoinfo    v_un.vu_fifoinfo
  98.  
  99. /*
  100.  * vnode flags.
  101.  */
  102. #define    VROOT        0x0001    /* root of its file system */
  103. #define    VTEXT        0x0002    /* vnode is a pure text prototype */
  104. #define    VSYSTEM        0x0004    /* vnode being used by kernel */
  105. #define    VXLOCK        0x0100    /* vnode is locked to change underlying type */
  106. #define    VXWANT        0x0200    /* process is waiting for vnode */
  107. #define    VBWAIT        0x0400    /* waiting for output to complete */
  108. #define    VALIASED    0x0800    /* vnode has an alias */
  109.  
  110. /*
  111.  * Vnode attributes.  A field value of VNOVAL
  112.  * represents a field whose value is unavailable
  113.  * (getattr) or which is not to be changed (setattr).
  114.  */
  115. struct vattr {
  116.     enum vtype    va_type;    /* vnode type (for create) */
  117.     u_short        va_mode;    /* files access mode and type */
  118.     short        va_nlink;    /* number of references to file */
  119.     uid_t        va_uid;        /* owner user id */
  120.     gid_t        va_gid;        /* owner group id */
  121.     long        va_fsid;    /* file system id (dev for now) */
  122.     long        va_fileid;    /* file id */
  123.     u_quad        va_qsize;    /* file size in bytes */
  124.     long        va_blocksize;    /* blocksize preferred for i/o */
  125.     struct timeval    va_atime;    /* time of last access */
  126.     struct timeval    va_mtime;    /* time of last modification */
  127.     struct timeval    va_ctime;    /* time file changed */
  128.     u_long        va_gen;        /* generation number of file */
  129.     u_long        va_flags;    /* flags defined for file */
  130.     dev_t        va_rdev;    /* device the special file represents */
  131.     u_quad        va_qbytes;    /* bytes of disk space held by file */
  132. };
  133. #if BYTE_ORDER == LITTLE_ENDIAN
  134. #define    va_size        va_qsize.val[0]
  135. #define    va_size_rsv    va_qsize.val[1]
  136. #define    va_bytes    va_qbytes.val[0]
  137. #define    va_bytes_rsv    va_qbytes.val[1]
  138. #else
  139. #define    va_size        va_qsize.val[1]
  140. #define    va_size_rsv    va_qsize.val[0]
  141. #define    va_bytes    va_qbytes.val[1]
  142. #define    va_bytes_rsv    va_qbytes.val[0]
  143. #endif
  144.  
  145. /*
  146.  * Operations on vnodes.
  147.  */
  148. #ifdef __STDC__
  149. struct flock;
  150. struct nameidata;
  151. #endif
  152.  
  153. struct vnodeops {
  154.     int    (*vop_lookup)    __P((struct vnode *vp, struct nameidata *ndp,
  155.                     struct proc *p));
  156.     int    (*vop_create)    __P((struct nameidata *ndp, struct vattr *vap,
  157.                     struct proc *p));
  158.     int    (*vop_mknod)    __P((struct nameidata *ndp, struct vattr *vap,
  159.                     struct ucred *cred, struct proc *p));
  160.     int    (*vop_open)    __P((struct vnode *vp, int mode,
  161.                     struct ucred *cred, struct proc *p));
  162.     int    (*vop_close)    __P((struct vnode *vp, int fflag,
  163.                     struct ucred *cred, struct proc *p));
  164.     int    (*vop_access)    __P((struct vnode *vp, int mode,
  165.                     struct ucred *cred, struct proc *p));
  166.     int    (*vop_getattr)    __P((struct vnode *vp, struct vattr *vap,
  167.                     struct ucred *cred, struct proc *p));
  168.     int    (*vop_setattr)    __P((struct vnode *vp, struct vattr *vap,
  169.                     struct ucred *cred, struct proc *p));
  170.     int    (*vop_read)    __P((struct vnode *vp, struct uio *uio,
  171.                     int ioflag, struct ucred *cred));
  172.     int    (*vop_write)    __P((struct vnode *vp, struct uio *uio,
  173.                     int ioflag, struct ucred *cred));
  174.     int    (*vop_ioctl)    __P((struct vnode *vp, int command,
  175.                     caddr_t data, int fflag,
  176.                     struct ucred *cred, struct proc *p));
  177.     int    (*vop_select)    __P((struct vnode *vp, int which, int fflags,
  178.                     struct ucred *cred, struct proc *p));
  179.     int    (*vop_mmap)    __P((struct vnode *vp, int fflags,
  180.                     struct ucred *cred, struct proc *p));
  181.     int    (*vop_fsync)    __P((struct vnode *vp, int fflags,
  182.                     struct ucred *cred, int waitfor,
  183.                     struct proc *p));
  184.     int    (*vop_seek)    __P((struct vnode *vp, off_t oldoff,
  185.                     off_t newoff, struct ucred *cred));
  186.     int    (*vop_remove)    __P((struct nameidata *ndp, struct proc *p));
  187.     int    (*vop_link)    __P((struct vnode *vp, struct nameidata *ndp,
  188.                     struct proc *p));
  189.     int    (*vop_rename)    __P((struct nameidata *fndp,
  190.                     struct nameidata *tdnp, struct proc *p));
  191.     int    (*vop_mkdir)    __P((struct nameidata *ndp, struct vattr *vap,
  192.                     struct proc *p));
  193.     int    (*vop_rmdir)    __P((struct nameidata *ndp, struct proc *p));
  194.     int    (*vop_symlink)    __P((struct nameidata *ndp, struct vattr *vap,
  195.                     char *target, struct proc *p));
  196.     int    (*vop_readdir)    __P((struct vnode *vp, struct uio *uio,
  197.                     struct ucred *cred, int *eofflagp));
  198.     int    (*vop_readlink)    __P((struct vnode *vp, struct uio *uio,
  199.                     struct ucred *cred));
  200.     int    (*vop_abortop)    __P((struct nameidata *ndp));
  201.     int    (*vop_inactive)    __P((struct vnode *vp, struct proc *p));
  202.     int    (*vop_reclaim)    __P((struct vnode *vp));
  203.     int    (*vop_lock)    __P((struct vnode *vp));
  204.     int    (*vop_unlock)    __P((struct vnode *vp));
  205.     int    (*vop_bmap)    __P((struct vnode *vp, daddr_t bn,
  206.                     struct vnode **vpp, daddr_t *bnp));
  207.     int    (*vop_strategy)    __P((struct buf *bp));
  208.     int    (*vop_print)    __P((struct vnode *vp));
  209.     int    (*vop_islocked)    __P((struct vnode *vp));
  210.     int    (*vop_advlock)    __P((struct vnode *vp, caddr_t id, int op,
  211.                     struct flock *fl, int flags));
  212. };
  213.  
  214. /* Macros to call the vnode ops */
  215. #define    VOP_LOOKUP(v,n,p)    (*((v)->v_op->vop_lookup))(v,n,p)
  216. #define    VOP_CREATE(n,a,p)    (*((n)->ni_dvp->v_op->vop_create))(n,a,p)
  217. #define    VOP_MKNOD(n,a,c,p)    (*((n)->ni_dvp->v_op->vop_mknod))(n,a,c,p)
  218. #define    VOP_OPEN(v,f,c,p)    (*((v)->v_op->vop_open))(v,f,c,p)
  219. #define    VOP_CLOSE(v,f,c,p)    (*((v)->v_op->vop_close))(v,f,c,p)
  220. #define    VOP_ACCESS(v,f,c,p)    (*((v)->v_op->vop_access))(v,f,c,p)
  221. #define    VOP_GETATTR(v,a,c,p)    (*((v)->v_op->vop_getattr))(v,a,c,p)
  222. #define    VOP_SETATTR(v,a,c,p)    (*((v)->v_op->vop_setattr))(v,a,c,p)
  223. #define    VOP_READ(v,u,i,c)    (*((v)->v_op->vop_read))(v,u,i,c)
  224. #define    VOP_WRITE(v,u,i,c)    (*((v)->v_op->vop_write))(v,u,i,c)
  225. #define    VOP_IOCTL(v,o,d,f,c,p)    (*((v)->v_op->vop_ioctl))(v,o,d,f,c,p)
  226. #define    VOP_SELECT(v,w,f,c,p)    (*((v)->v_op->vop_select))(v,w,f,c,p)
  227. #define    VOP_MMAP(v,c,p)        (*((v)->v_op->vop_mmap))(v,c,p)
  228. #define    VOP_FSYNC(v,f,c,w,p)    (*((v)->v_op->vop_fsync))(v,f,c,w,p)
  229. #define    VOP_SEEK(v,p,o,w)    (*((v)->v_op->vop_seek))(v,p,o,w)
  230. #define    VOP_REMOVE(n,p)        (*((n)->ni_dvp->v_op->vop_remove))(n,p)
  231. #define    VOP_LINK(v,n,p)        (*((n)->ni_dvp->v_op->vop_link))(v,n,p)
  232. #define    VOP_RENAME(s,t,p)    (*((s)->ni_dvp->v_op->vop_rename))(s,t,p)
  233. #define    VOP_MKDIR(n,a,p)    (*((n)->ni_dvp->v_op->vop_mkdir))(n,a,p)
  234. #define    VOP_RMDIR(n,p)        (*((n)->ni_dvp->v_op->vop_rmdir))(n,p)
  235. #define    VOP_SYMLINK(n,a,m,p)    (*((n)->ni_dvp->v_op->vop_symlink))(n,a,m,p)
  236. #define    VOP_READDIR(v,u,c,e)    (*((v)->v_op->vop_readdir))(v,u,c,e)
  237. #define    VOP_READLINK(v,u,c)    (*((v)->v_op->vop_readlink))(v,u,c)
  238. #define    VOP_ABORTOP(n)        (*((n)->ni_dvp->v_op->vop_abortop))(n)
  239. #define    VOP_INACTIVE(v,p)    (*((v)->v_op->vop_inactive))(v,p)
  240. #define    VOP_RECLAIM(v)        (*((v)->v_op->vop_reclaim))(v)
  241. #define    VOP_LOCK(v)        (*((v)->v_op->vop_lock))(v)
  242. #define    VOP_UNLOCK(v)        (*((v)->v_op->vop_unlock))(v)
  243. #define    VOP_BMAP(v,s,p,n)    (*((v)->v_op->vop_bmap))(v,s,p,n)
  244. #define    VOP_STRATEGY(b)        (*((b)->b_vp->v_op->vop_strategy))(b)
  245. #define    VOP_PRINT(v)        (*((v)->v_op->vop_print))(v)
  246. #define    VOP_ISLOCKED(v)        (((v)->v_flag & VXLOCK) || \
  247.                 (*((v)->v_op->vop_islocked))(v))
  248. #define    VOP_ADVLOCK(v,p,o,l,f)    (*((v)->v_op->vop_advlock))(v,p,o,l,f)
  249.  
  250. /*
  251.  * flags for ioflag
  252.  */
  253. #define    IO_UNIT        0x01        /* do I/O as atomic unit */
  254. #define    IO_APPEND    0x02        /* append write to end */
  255. #define    IO_SYNC        0x04        /* do I/O synchronously */
  256. #define    IO_NODELOCKED    0x08        /* underlying node already locked */
  257. #define    IO_NDELAY    0x10        /* FNDELAY flag set in file table */
  258.  
  259. /*
  260.  *  Modes. Some values same as Ixxx entries from inode.h for now
  261.  */
  262. #define    VSUID    04000        /* set user id on execution */
  263. #define    VSGID    02000        /* set group id on execution */
  264. #define    VSVTX    01000        /* save swapped text even after use */
  265. #define    VREAD    0400        /* read, write, execute permissions */
  266. #define    VWRITE    0200
  267. #define    VEXEC    0100
  268.  
  269. /*
  270.  * Token indicating no attribute value yet assigned
  271.  */
  272. #define    VNOVAL    ((unsigned)0xffffffff)
  273.  
  274. #ifdef KERNEL
  275. /*
  276.  * public vnode manipulation functions
  277.  */
  278. int     vn_open __P((struct nameidata *ndp, struct proc *p, int fmode,
  279.         int cmode));
  280. int     vn_close __P((struct vnode *vp, int flags, struct ucred *cred,
  281.         struct proc *p));
  282. int     vn_rdwr __P((enum uio_rw rw, struct vnode *vp, caddr_t base,
  283.         int len, off_t offset, enum uio_seg segflg, int ioflg,
  284.         struct ucred *cred, int *aresid, struct proc *p));
  285. int    vn_read __P((struct file *fp, struct uio *uio, struct ucred *cred));
  286. int    vn_write __P((struct file *fp, struct uio *uio, struct ucred *cred));
  287. int    vn_ioctl __P((struct file *fp, int com, caddr_t data, struct proc *p));
  288. int    vn_select __P((struct file *fp, int which, struct proc *p));
  289. int     vn_closefile __P((struct file *fp, struct proc *p));
  290. int     getnewvnode __P((enum vtagtype tag, struct mount *mp,
  291.         struct vnodeops *vops, struct vnode **vpp));
  292. int     bdevvp __P((int dev, struct vnode **vpp));
  293.     /* check for special device aliases */
  294.     /* XXX nvp_rdev should be type dev_t, not int */
  295. struct     vnode *checkalias __P((struct vnode *vp, int nvp_rdev,
  296.         struct mount *mp));
  297. void     vattr_null __P((struct vattr *vap));
  298. int     vcount __P((struct vnode *vp));    /* total references to a device */
  299. int     vget __P((struct vnode *vp));    /* get first reference to a vnode */
  300. void     vref __P((struct vnode *vp));    /* increase reference to a vnode */
  301. void     vput __P((struct vnode *vp));    /* unlock and release vnode */
  302. void     vrele __P((struct vnode *vp));    /* release vnode */
  303. void     vgone __P((struct vnode *vp));    /* completely recycle vnode */
  304. void     vgoneall __P((struct vnode *vp));/* recycle vnode and all its aliases */
  305.  
  306. /*
  307.  * Flags to various vnode functions.
  308.  */
  309. #define    SKIPSYSTEM    0x0001        /* vflush: skip vnodes marked VSYSTEM */
  310. #define    FORCECLOSE    0x0002        /* vflush: force file closeure */
  311. #define    DOCLOSE        0x0004        /* vclean: close active files */
  312.  
  313. #ifndef DIAGNOSTIC
  314. #define    VREF(vp)    (vp)->v_usecount++    /* increase reference */
  315. #define    VHOLD(vp)    (vp)->v_holdcnt++    /* increase buf or page ref */
  316. #define    HOLDRELE(vp)    (vp)->v_holdcnt--    /* decrease buf or page ref */
  317. #define    VATTR_NULL(vap)    (*(vap) = va_null)    /* initialize a vattr */
  318. #else /* DIAGNOSTIC */
  319. #define    VREF(vp)    vref(vp)
  320. #define    VHOLD(vp)    vhold(vp)
  321. #define    HOLDRELE(vp)    holdrele(vp)
  322. #define    VATTR_NULL(vap)    vattr_null(vap)
  323. #endif
  324.  
  325. #define    NULLVP    ((struct vnode *)NULL)
  326.  
  327. /*
  328.  * Global vnode data.
  329.  */
  330. extern    struct vnode *rootdir;        /* root (i.e. "/") vnode */
  331. extern    long desiredvnodes;        /* number of vnodes desired */
  332. extern    struct vattr va_null;        /* predefined null vattr structure */
  333. #endif
  334.